package SingletonPattern;

public class Singleton {

	/*
	 * Singleton sınıfından oluşturulabilecektek nesne static sınıf değişkeni
	 * olarak tanımlanıyor.
	 */
	private static Singleton instance = null;

	/*
	 * Double check locking yapabilmekiçin kullanılan nesne.
	 */
	private static Object lock = new Object();

	/*
	 * Başka sınıfların new Singleton()şeklinde nesne oluşturmalarını,sınıf
	 * konstraktırını private yaparak engellemiş oluyoruz.
	 */

	private Singleton() {
		System.out.println("singletion init()");
	}

	/*
	 * Singleton sınıfından oluşturulabilen tek nesneye ulaşmak için instance()
	 * metodu kullanılır.
	 *
	 *@return Singleton static Singleton nesnesi
	 *
	 */
	

	public static Singleton instance() {

		if (instance == null) {

			// Double checked loking
			synchronized (lock) {
              
				if (instance == null) {
      
					instance = new Singleton();
				}
			}

		}

		return instance;

	}
	
	//Ekrana basan metod...
	public void printThis() {
	  
		System.out.println(this);

	}
 
}
